7 Flex を使うその他の実例


ここでは Flex の使用例をさらにいくつか紹介します。ここでの例は、必ずしも最適な実装ではありませんが、一般的な Flex の使い方を示してくれるはずです。

7.1 単語数、文字数、行数のカウント

以下の定義は、与えられたファイルの中の単語数、文字数、行数をカウントするのに Flex を使う方法を示す簡単な例です。実際に Flex に関係のある部分は非常に少ないことに注意してください。以下のコードのほとんどは、コマンドライン・パラメータを処理したりカウントの合計を保持したりするものです。

7.2 Pascal のサブセット用の字句スキャナ

ここでは、Pascal のような言語用の字句スキャナを構築する方法を示します。このスキャナ定義では、個々のキーワードがルールとしてリストされています。(すべてのキーワードをテーブルに格納してからテーブル検索を使う手法が一般的にはよく見られますが、)ここでの方法はキーワードと識別子とを区別するための方法としては、一般的に最も簡単なものです。また、識別子用にただ1つのルールがあるという点に注意してください。多くの場合、これはシンボル・テーブルを管理するためのサブルーチンを呼び出します。

もう1つ注意すべきなのは、_FILE と _BEGIN が先頭にアンダースコア _ を持つという点です。Flex もしくは C で定義されているいくつかの名前は、追加的な工夫なしでは使えないということを示すためにこのようにしてあります。これよりももっと一般的に使われる手法は、すべてのトークンの先頭もしくは末尾に何らかの文字列を付加するというもので、こうすることによって問題は発生しなくなります。TOK や SYM が一般的によく使われる拡張子です。

7.3 専門用語の変換

ここでは、スタート状態を使って、Flex により生成されるスキャナの内部に小規模のパーサを構築する方法の例を示します。このコードは The New Hackers Dictionary( prep.ai.mit.edu およびその他の多くのインターネット FTP サイトから入手可能なテキスト形式のもの)を入力として受け取り、すぐに製版および印刷できる状態の Texinfo フォーマットのドキュメントに変換するものです。このコードは jargon2910.ascii を使ってテスト済みです。

典型的な使い方は以下のとおりです。

このプログラムは、使うのに便利な info ファイルに変換可能なファイルは作成しませんが、そのような機能は大した困難もなく追加することが可能です。この例は非常に長いものですが、大して複雑でもないので、尻込みしないで研究してみてください。 このプログラムは ASCII の専門用語ファイルを読み込んで、いくつかのよく見られるパターンを検索します。これらのパターンは、オリジナルの Texinfo 形式の専門用語ファイルを単なる ASCII テキストに変換した際に作成されたものです。この変換の過程で、多くのマークアップ情報が失われているために、ある出力結果の元になったオリジナルの情報が何であったか、あるいは、そのオリジナルの候補が2つ3つあったとしてもそのうちのどれがその出力結果をもたらしたかを正確に決定することが困難であるという事情のため、この検索作業はいくらか複雑なものになります。よく見られるパターンをいくつか挙げると、以下のようになります。
 
章、節、項  これらの先頭にはいずれも同じパターンが来ます。 
    :some text:\n 
このうしろに、(章の場合は)アスタリスクによる下線、(節の場合は)等号による下線、(項の場合は)マイナス記号による下線が続きます。 
 
強調  これは少し難しいのですが、一般的には強調は(イタリックの場合は) *...*、(強調文字(strong)の場合は){{...}}、(太字(bold)の場合は){...} の対によって示されます。ここでは、これらを検索して、コマンドを出力します。 
 
例および列挙されたリスト  これらはともにコロンで始まり、そのうしろに、1つ以上の改行、少なくとも5つの空白、そして最後に数字もしくは何らかのテキストが続きます。例えば、 

...列挙: 

     0.何らかのテキスト 
     1.さらに何らかのテキスト 

...例: 

     (インデントされた)何らかのテキストが 
     ここに入りしばらく続く 
 

項目化されマークを付けられたリスト  これらは、例および列挙されたリストによく似ていますが、違いは、項目の先頭にコロンもしくはアスタリスクがあり、末尾にコロンがあるという点です。 
 
 
ここでの例は、パースされているものが何であるかを示すヒントとしてこのようなパターンを使い、その特定のセクション用のサブ・パーサを(ほとんどの場合、排他的)スタート状態を使って構築します。ASCII 版の専門用語ファイルを持っているのであれば、スキャナのどの部分がそのファイル中の何にマッチするかを検証してみる値打ちがあります。例えば、HEADING 状態において @item を生成するルールがすべての専門用語のエントリを処理するルールでもあるということは、おそらく一見しただけでは明らかではないでしょう。


Copyright (C) 1992, 1993 Free Software Foundation

Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Free Software Foundation.


日本語訳:市川和久
Japanese translation by Kazuhisa Ichikawa (ki@home.email.ne.jp)